From 32795963c06ba7f6439c263ef421c15b81ef381a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 13 Feb 2019 23:07:36 -0500 Subject: [PATCH] entry: Implement new editable iface --- gtk/gtkentry.c | 117 +++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 61 deletions(-) diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 4585df6899..2050cfcdff 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -458,9 +458,8 @@ static void gtk_entry_insert_text (GtkEditable *editable, static void gtk_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos); -static gchar * gtk_entry_get_chars (GtkEditable *editable, - gint start_pos, - gint end_pos); +static const char *gtk_entry_real_get_text (GtkEditable *editable); +static int gtk_entry_get_length (GtkEditable *editable); static void gtk_entry_real_set_position (GtkEditable *editable, gint position); static gint gtk_entry_get_position (GtkEditable *editable); @@ -470,6 +469,8 @@ static void gtk_entry_set_selection_bounds (GtkEditable *editable, static gboolean gtk_entry_get_selection_bounds (GtkEditable *editable, gint *start, gint *end); +static void gtk_entry_set_editable (GtkEditable *editable, + gboolean is_editable); /* GtkCellEditable method implementations */ @@ -1884,6 +1885,47 @@ gtk_entry_class_init (GtkEntryClass *class) gtk_widget_class_set_css_name (widget_class, I_("entry")); } +static void +gtk_entry_set_editable (GtkEditable *editable, + gboolean is_editable) +{ + GtkEntry *entry = GTK_ENTRY (editable); + GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (entry)); + + if (is_editable != priv->editable) + { + GtkWidget *widget = GTK_WIDGET (entry); + + if (!is_editable) + { + gtk_entry_reset_im_context (entry); + if (gtk_widget_has_focus (widget)) + gtk_im_context_focus_out (priv->im_context); + + priv->preedit_length = 0; + priv->preedit_cursor = 0; + + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_READ_ONLY); + } + else + { + gtk_style_context_add_class (context, GTK_STYLE_CLASS_READ_ONLY); + } + + priv->editable = is_editable; + + if (is_editable && gtk_widget_has_focus (widget)) + gtk_im_context_focus_in (priv->im_context); + + gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), + is_editable ? priv->im_context : NULL); + + g_object_notify (G_OBJECT (editable), "editable"); + gtk_widget_queue_draw (widget); + } +} + static void gtk_entry_editable_init (GtkEditableInterface *iface) { @@ -1891,7 +1933,8 @@ gtk_entry_editable_init (GtkEditableInterface *iface) iface->do_delete_text = gtk_entry_delete_text; iface->insert_text = gtk_entry_real_insert_text; iface->delete_text = gtk_entry_real_delete_text; - iface->get_chars = gtk_entry_get_chars; + iface->get_text = gtk_entry_real_get_text; + iface->get_length = gtk_entry_get_length; iface->set_selection_bounds = gtk_entry_set_selection_bounds; iface->get_selection_bounds = gtk_entry_get_selection_bounds; iface->set_position = gtk_entry_real_set_position; @@ -1920,42 +1963,7 @@ gtk_entry_set_property (GObject *object, break; case PROP_EDITABLE: - { - gboolean new_value = g_value_get_boolean (value); - GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (entry)); - - if (new_value != priv->editable) - { - GtkWidget *widget = GTK_WIDGET (entry); - - if (!new_value) - { - gtk_entry_reset_im_context (entry); - if (gtk_widget_has_focus (widget)) - gtk_im_context_focus_out (priv->im_context); - - priv->preedit_length = 0; - priv->preedit_cursor = 0; - - gtk_style_context_remove_class (context, GTK_STYLE_CLASS_READ_ONLY); - } - else - { - gtk_style_context_add_class (context, GTK_STYLE_CLASS_READ_ONLY); - } - - priv->editable = new_value; - - if (new_value && gtk_widget_has_focus (widget)) - gtk_im_context_focus_in (priv->im_context); - - gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), - new_value ? priv->im_context : NULL); - - g_object_notify_by_pspec (object, pspec); - gtk_widget_queue_draw (widget); - } - } + gtk_entry_set_editable (GTK_EDITABLE (entry), g_value_get_boolean (value)); break; case PROP_MAX_LENGTH: @@ -4274,29 +4282,16 @@ gtk_entry_delete_text (GtkEditable *editable, g_object_unref (editable); } -static gchar * -gtk_entry_get_chars (GtkEditable *editable, - gint start_pos, - gint end_pos) +static const char * +gtk_entry_real_get_text (GtkEditable *editable) { - GtkEntry *entry = GTK_ENTRY (editable); - const gchar *text; - gint text_length; - gint start_index, end_index; - - text = gtk_entry_buffer_get_text (get_buffer (entry)); - text_length = gtk_entry_buffer_get_length (get_buffer (entry)); - - if (end_pos < 0) - end_pos = text_length; - - start_pos = MIN (text_length, start_pos); - end_pos = MIN (text_length, end_pos); - - start_index = g_utf8_offset_to_pointer (text, start_pos) - text; - end_index = g_utf8_offset_to_pointer (text, end_pos) - text; + return gtk_entry_buffer_get_text (gtk_entry_get_buffer (GTK_ENTRY (editable))); +} - return g_strndup (text + start_index, end_index - start_index); +static int +gtk_entry_get_length (GtkEditable *editable) +{ + return gtk_entry_buffer_get_length (gtk_entry_get_buffer (GTK_ENTRY (editable))); } static void -- 2.30.2